package unipe.p4.programacao3.model.livro;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import org.hibernate.annotations.NamedQueries;
import org.hibernate.annotations.NamedQuery;

@Entity
@NamedQueries({
	@NamedQuery(
			name="Livro.findAll",
			query="SELECT o FROM Livro o"),
	@NamedQuery(
			name="Livro.count",
			query="SELECT COUNT(o) FROM Livro o"),
	@NamedQuery(
			name="Livro.findById",
			query="SELECT o FROM Livro o WHERE o.id=:id"),
	@NamedQuery(
			name="Livro.ItemLivro.count",
			query="SELECT COUNT(o.itens) FROM Livro o WHERE o.id=:id"),
	@NamedQuery(
			name="Livro.ItemLivro.findAll",
			query="SELECT o.itens FROM Livro o WHERE o.id=:id")
})
public class Livro implements Serializable {
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue
	private Long id;	
	@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.REFRESH,
			CascadeType.MERGE,CascadeType.DETACH})
	private Editora editora;
	private String titulo;
	private int ano;
	private float largura;
	private float altura;
	private int edicao;
	private int paginas;
	private String sinopse;
	private String isbn;
	private String colecao;
	private Date dataCadastro;
	@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.REFRESH,
			CascadeType.MERGE,CascadeType.DETACH})
	private List<Autor> autores = new ArrayList<Autor>();
	@ManyToOne(cascade={CascadeType.PERSIST,CascadeType.REFRESH,
			CascadeType.MERGE,CascadeType.DETACH})
	private Assunto assunto;
	@OneToMany(mappedBy="livro",cascade={CascadeType.PERSIST,CascadeType.REFRESH,
			CascadeType.MERGE,CascadeType.DETACH})
	private List<ItemLivro> itens = new ArrayList<ItemLivro>();
	
	public Livro() {
		super();
	}
	
	public Livro(Editora editora, String titulo, int ano, float largura,
			float altura, int edicao, int paginas, String sinopse, String isbn,
			String colecao, Date dataCadastro, List<ItemLivro> itens,
			List<Autor> autores, Assunto assunto) {
		super();
		this.editora = editora;
		this.titulo = titulo;
		this.ano = ano;
		this.largura = largura;
		this.altura = altura;
		this.edicao = edicao;
		this.paginas = paginas;
		this.sinopse = sinopse;
		this.isbn = isbn;
		this.colecao = colecao;
		this.dataCadastro = dataCadastro;
		this.itens = itens;
		this.autores = autores;
		this.assunto = assunto;
	}

	public Livro(Editora editora, String titulo, int ano, float largura,
			float altura, int edicao, int paginas, String sinopse, String isbn,
			String colecao, Date dataCadastro, List<ItemLivro> itens,
			List<Autor> autores) {
		super();
		this.editora = editora;
		this.titulo = titulo;
		this.ano = ano;
		this.largura = largura;
		this.altura = altura;
		this.edicao = edicao;
		this.paginas = paginas;
		this.sinopse = sinopse;
		this.isbn = isbn;
		this.colecao = colecao;
		this.dataCadastro = dataCadastro;
		this.itens = itens;
		this.autores = autores;
	}

	public Livro(Editora editora, String titulo, int ano, float largura,
			float altura, int edicao, int paginas, String sinopse, String isbn,
			String colecao, Date dataCadastro, List<ItemLivro> itens) {
		super();
		this.editora = editora;
		this.titulo = titulo;
		this.ano = ano;
		this.largura = largura;
		this.altura = altura;
		this.edicao = edicao;
		this.paginas = paginas;
		this.sinopse = sinopse;
		this.isbn = isbn;
		this.colecao = colecao;
		this.dataCadastro = dataCadastro;
		this.itens = itens;
	}

	public Livro(Editora editora, String titulo, int ano, float largura,
			float altura, int edicao, int paginas, String sinopse, String isbn,
			String colecao, Date dataCadastro) {
		super();
		this.editora = editora;
		this.titulo = titulo;
		this.ano = ano;
		this.largura = largura;
		this.altura = altura;
		this.edicao = edicao;
		this.paginas = paginas;
		this.sinopse = sinopse;
		this.isbn = isbn;
		this.colecao = colecao;
		this.dataCadastro = dataCadastro;
	}

	public Long getId() {
		return id;
	}
	
	public void setId(Long id) {
		this.id = id;
	}
	
	public Editora getEditora() {
		return editora;
	}
	
	public void setEditora(Editora editora) {
		this.editora = editora;
	}
	
	public String getTitulo() {
		return titulo;
	}
	
	public void setTitulo(String titulo) {
		this.titulo = titulo;
	}
	
	public int getAno() {
		return ano;
	}
	
	public void setAno(int ano) {
		this.ano = ano;
	}
	
	public float getLargura() {
		return largura;
	}
	
	public void setLargura(float largura) {
		this.largura = largura;
	}
	
	public float getAltura() {
		return altura;
	}
	
	public void setAltura(float altura) {
		this.altura = altura;
	}
	
	public int getEdicao() {
		return edicao;
	}
	
	public void setEdicao(int edicao) {
		this.edicao = edicao;
	}
	
	public int getPaginas() {
		return paginas;
	}
	
	public void setPaginas(int paginas) {
		this.paginas = paginas;
	}
	
	public String getSinopse() {
		return sinopse;
	}
	
	public void setSinopse(String sinopse) {
		this.sinopse = sinopse;
	}
	
	public String getIsbn() {
		return isbn;
	}
	
	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}
	
	public String getColecao() {
		return colecao;
	}
	
	public void setColecao(String colecao) {
		this.colecao = colecao;
	}
	
	public Date getDataCadastro() {
		return dataCadastro;
	}
	
	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}
	
	public List<ItemLivro> getItens() {
		return itens;
	}
	
	public void setItens(List<ItemLivro> itens) {
		this.itens = itens;
	}
	
	public List<Autor> getAutores() {
		return autores;
	}
	
	public void setAutores(List<Autor> autores) {
		this.autores = autores;
	}
	
	public Assunto getAssunto() {
		return assunto;
	}
	
	public void setAssunto(Assunto assunto) {
		this.assunto = assunto;
	}
	
	@Override
	public String toString() {
		return "Livro [id=" + this.id + ", titulo=" + this.titulo + "]";
	}
	
}
